大家好!鐵人賽邁入第八天。
在昨天,我們用一個簡易的計算機 server,成功地展示了 AI Agent 呼叫 MCP Server 的基本流程。今天,我們要將難度與實用性大幅提升,打造一個能串接外部真實 API 的「天氣查詢工具」。
這個專案將會比計算機複雜,因為我們需要處理:
最終,我們將會建立一個能透過聊天視窗查詢台灣各縣市天氣的 AI 應用!
為了讓我們的專案結構清晰、易於維護,我們將建立三個各自獨立又互相協作的工作流:
Weather
(天氣邏輯核心): 這個工作流是我們的「工具」。它的職責很單純:接收一個城市名稱,去中央氣象署抓取資料,然後將複雜的資料整理成一段簡潔的摘要。MCPClient
(MCP 伺服器): 這個工作流是我們的「專案經理」。它負責對外溝通,將「天氣邏輯核心」包裝成一個符合 MCP 規範的工具,供 AI Agent 發現和呼叫。MCP Demo
(AI Agent 主流程): 這是我們的「HOST」。使用者在這裡下達指令,AI Agent 會在這裡進行思考和決策。這種「職責分離」的架構,是軟體工程中的一個非常好的實踐!
我們從最內層的工人——Weather
工作流開始。
Weather
。When Executed by Another Workflow
節點。這表示它只能被其他 n8n 工作流觸發。Code
節點: 接收傳入的城市名稱(例如 {"city": "臺中市"}
),並使用我們之前學到的 Python 程式碼,組裝出中央氣象署 OpenData 的 API URL。import urllib.parse
# 這個腳本會處理所有傳入的項目
# 並假設每個項目中都有一個名為 'city' 的欄位
for item in _input.all():
# 1. 從傳入的 JSON 中獲取城市名稱
# 使用 .get() 是更安全的方式,如果找不到 'city',就使用預設值 '台北市'
city_name = item.json.get('city', '臺北市')
# 2. 定義 API 的固定部分
base_url = "https://opendata.cwa.gov.tw/api/v1/rest/datastore/F-C0032-001"
auth_token = "CWA-A4AA97C5-E3C1-4BEB-B730-688876F81863"
# 3. 對中文城市名稱進行 URL 編碼
# 這一步會將 "台中市" 轉換成 "%E8%87%BA%E4%B8%AD%E5%B8%82"
encoded_location_name = urllib.parse.quote(city_name)
# 4. 使用 f-string 組裝出完整的 API 網址
full_api_url = f"{base_url}?Authorization={auth_token}&locationName={encoded_location_name}"
# 5. 將產生好的網址,新增到 JSON 的一個新欄位 'apiUrl' 中
item.json['apiUrl'] = full_api_url
# 將所有被修改過的項目回傳給下一個節點
return _input.all()
HTTP Request
節點: 使用 GET
方法,呼叫 Code
節點產生的 URL,獲取天氣預報的原始 JSON 資料。設定如片如下
Edit Fields
(或 Set
) 節點: 氣象署回傳的資料非常龐大。使用這個節點來提取我們真正需要的欄位,例如未來幾個時段的「最高溫度」、「最低溫度」、「降雨機率」和「天氣狀況」。
Basic LLM Chain
節點: 這是畫龍點睛的一步!我們不直接回傳枯燥的數據,而是將提取出來的關鍵數據,交給另一個 LLM (例如 Gemini),並下 prompt。
你是一位智慧天氣助理,請根據以下輸入的臺中市逐時氣溫與每三小時降雨機率資料,整理出未來三天的天氣預報摘要,請優先使用資料內最早的日期優先當作第一天,請用繁體中文說明,並依照以下格式輸出:
以下是氣象資料:
每小時氣溫:包含 DataTime 與 ElementValue(溫度值): {{ $json.MinT }}{{ $json.MaxT }}
每三小時降雨機率:包含 StartTime、EndTime 與 ProbabilityOfPrecipitation : {{ $json.Rain }}
體感舒適度:{{ $json.Comfortindex }}
綜合天氣評論:{{ $json.Description }}
---
日期:年-月-日
天氣狀況:(可根據溫度與降雨機率簡要判斷,如「晴朗」、「局部短暫雨」、「午後雷陣雨」等)
最高溫度:°C
最低溫度:°C
降雨機率:%(取當天所有降雨機率中的最高值)
舒適程度:
請連續列出兩天資料,其餘皆不要輸出。並且使用繁體中文。
您的 Weather
工作流,完美地展示了從接收參數到最終用 LLM 美化輸出的完整過程。
接下來,我們建立「專案經理」——MCPClient
工作流,將剛剛的 Weather
工作流包裝成一個標準的 MCP 工具。
新建工作流,並命名為 MCPClient
。
觸發器: 這次我們使用 MCP Server Trigger
節點。這個節點會生成一個專屬的 URL,讓外部的 MCP Host (如 Claude Desktop 或我們的 AI Agent) 可以連接。
新增工具 (Call n8n Workflow Tool
):
MCP Server Trigger
下方,點擊 +
號,選擇 Add Tool
,然後選擇 Call n8n Workflow Tool
。Call this tool to get weather data
(好的描述能幫助 AI Agent 更好地理解工具用途)city
的參數。Weather
工作流。儲存並啟用 (Active) 工作流。
您的 MCPClient
工作流,清晰地展示了如何將一個內部工作流 (Call n8n Workflow Tool
) 透過 MCP Server Trigger
暴露成一個外部可用的工具。
萬事俱備,只欠東風!現在回到我們的「HOST」——MCP Demo
工作流。
MCP Demo
工作流。AI Agent
節點。Tools
欄位,除了原有的計算機工具外,點擊 Add Tool
,你會看到一個新的選項,來自我們的 MCP Server Trigger
,選擇它,並將 get_weather_forecast_for_taiwan_city
工具掛載上去。打開 MCP Demo
工作流的聊天視窗,輸入你的指令:
給我臺中市天氣
你會看到 AI Agent 接收到指令後,經過短暫的思考,成功地呼叫了我們的天氣工具,並回傳了由 LLM 整理過的、非常人性化的天氣預報!
從日誌中可以看到,AI Agent (第一個 LLM) 決定使用工具,MCP Client
成功執行並回傳結果,最終由第二個 LLM 整合輸出。
恭喜你!今天我們完成了一個非常貼近真實應用場景的專案。我們學會了:
我們的 AI Agent 不再只是一個玩具,它已經具備了連接真實世界、獲取即時資訊的強大能力。明天,我們將繼續挑戰,打造下一個更酷的工具!